home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 15 / CU Amiga Magazine's Super CD-ROM 15 (1997)(EMAP Images)(GB)[!][issue 1997-10].iso / CUCD / Graphics / Ghostscript / source / gxsample.c < prev    next >
C/C++ Source or Header  |  1997-04-20  |  5KB  |  187 lines

  1. /* Copyright (C) 1997 Aladdin Enterprises.  All rights reserved.
  2.   
  3.   This file is part of Aladdin Ghostscript.
  4.   
  5.   Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  6.   or distributor accepts any responsibility for the consequences of using it,
  7.   or for whether it serves any particular purpose or works at all, unless he
  8.   or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  9.   License (the "License") for full details.
  10.   
  11.   Every copy of Aladdin Ghostscript must include a copy of the License,
  12.   normally in a plain ASCII text file named PUBLIC.  The License grants you
  13.   the right to copy, modify and redistribute Aladdin Ghostscript, but only
  14.   under certain conditions described in the License.  Among other things, the
  15.   License requires that the copyright notice and this notice be preserved on
  16.   all copies.
  17. */
  18.  
  19. /* gxsample.c */
  20. /* Sample unpacking procedures */
  21. #include "gx.h"
  22. #include "gxsample.h"
  23.  
  24. /* ---------------- Lookup tables ---------------- */
  25.  
  26. /*
  27.  * Define standard tables for spreading 1-bit input data.
  28.  * Note that these depend on the end-orientation of the CPU.
  29.  * We can't simply define them as byte arrays, because
  30.  * they might not wind up properly long- or short-aligned.
  31.  */
  32. #define map4tox(z,a,b,c,d)\
  33.     z, z^a, z^b, z^(a+b),\
  34.     z^c, z^(a+c), z^(b+c), z^(a+b+c),\
  35.     z^d, z^(a+d), z^(b+d), z^(a+b+d),\
  36.     z^(c+d), z^(a+c+d), z^(b+c+d), z^(a+b+c+d)
  37. #if arch_is_big_endian
  38. const bits32 lookup4x1to32_identity[16] =
  39.    {    map4tox(0L, 0xffL, 0xff00L, 0xff0000L, 0xff000000L)    };
  40. const bits32 lookup4x1to32_inverted[16] =
  41.    {    map4tox(0xffffffffL, 0xffL, 0xff00L, 0xff0000L, 0xff000000L)    };
  42. #else                    /* !arch_is_big_endian */
  43. const bits32 lookup4x1to32_identity[16] =
  44.    {    map4tox(0L, 0xff000000L, 0xff0000L, 0xff00L, 0xffL)    };
  45. const bits32 lookup4x1to32_inverted[16] =
  46.    {    map4tox(0xffffffffL, 0xff000000L, 0xff0000L, 0xff00L, 0xffL)    };
  47. #endif
  48.  
  49. /* ---------------- Unpacking procedures ---------------- */
  50.  
  51. const byte *
  52. sample_unpack_copy(byte *bptr, int *pdata_x, const byte *data, int data_x,
  53.   uint dsize, const sample_lookup_t *ignore_ptab, int spread)
  54. {    /* We're going to use the data right away, so no copying is needed. */
  55.     *pdata_x = data_x;
  56.     return data;
  57. }
  58.  
  59. const byte *
  60. sample_unpack_1(byte *bptr, int *pdata_x, const byte *data, int data_x,
  61.   uint dsize, const sample_lookup_t *ptab, int spread)
  62. {    const byte *psrc = data + (data_x >> 3);
  63.     int left = dsize - (data_x >> 3);
  64.  
  65.     if ( spread == 1 )
  66.       { bits32 *bufp = (bits32 *)bptr;
  67.         const bits32 *map = &ptab->lookup4x1to32[0];
  68.         uint b;
  69.  
  70.         if ( left & 1 )
  71.           { b = psrc[0];
  72.         bufp[0] = map[b >> 4];
  73.         bufp[1] = map[b & 0xf];
  74.         psrc++, bufp += 2;
  75.           }
  76.         left >>= 1;
  77.         while ( left-- )
  78.           { b = psrc[0];
  79.         bufp[0] = map[b >> 4];
  80.         bufp[1] = map[b & 0xf];
  81.         b = psrc[1];
  82.         bufp[2] = map[b >> 4];
  83.         bufp[3] = map[b & 0xf];
  84.         psrc += 2, bufp += 4;
  85.           }
  86.       }
  87.     else
  88.       { byte *bufp = bptr;
  89.         const byte *map = &ptab->lookup8[0];
  90.  
  91.         while ( left-- )
  92.           { uint b = *psrc++;
  93.         *bufp = map[b >> 7]; bufp += spread;
  94.         *bufp = map[(b >> 6) & 1]; bufp += spread;
  95.         *bufp = map[(b >> 5) & 1]; bufp += spread;
  96.         *bufp = map[(b >> 4) & 1]; bufp += spread;
  97.         *bufp = map[(b >> 3) & 1]; bufp += spread;
  98.         *bufp = map[(b >> 2) & 1]; bufp += spread;
  99.         *bufp = map[(b >> 1) & 1]; bufp += spread;
  100.         *bufp = map[b & 1]; bufp += spread;
  101.           }
  102.       }
  103.     *pdata_x = data_x & 7;
  104.     return bptr;
  105. }
  106.  
  107. const byte *
  108. sample_unpack_2(byte *bptr, int *pdata_x, const byte *data, int data_x,
  109.   uint dsize, const sample_lookup_t *ptab, int spread)
  110. {    const byte *psrc = data + (data_x >> 2);
  111.     int left = dsize - (data_x >> 2);
  112.  
  113.     if ( spread == 1 )
  114.       { bits16 *bufp = (bits16 *)bptr;
  115.         const bits16 *map = &ptab->lookup2x2to16[0];
  116.  
  117.         while ( left-- )
  118.           { uint b = *psrc++;
  119.         *bufp++ = map[b >> 4];
  120.         *bufp++ = map[b & 0xf];
  121.           }
  122.       }
  123.     else
  124.       { byte *bufp = bptr;
  125.         const byte *map = &ptab->lookup8[0];
  126.  
  127.         while ( left-- )
  128.           { unsigned b = *psrc++;
  129.         *bufp = map[b >> 6]; bufp += spread;
  130.         *bufp = map[(b >> 4) & 3]; bufp += spread;
  131.         *bufp = map[(b >> 2) & 3]; bufp += spread;
  132.         *bufp = map[b & 3]; bufp += spread;
  133.           }
  134.       }
  135.     *pdata_x = data_x & 3;
  136.     return bptr;
  137. }
  138.  
  139. const byte *
  140. sample_unpack_4(byte *bptr, int *pdata_x, const byte *data, int data_x,
  141.   uint dsize, const sample_lookup_t *ptab, int spread)
  142. {    byte *bufp = bptr;
  143.     const byte *psrc = data + (data_x >> 1);
  144.     int left = dsize - (data_x >> 1);
  145.     const byte *map = &ptab->lookup8[0];
  146.  
  147.     while ( left-- )
  148.        {    uint b = *psrc++;
  149.         *bufp = map[b >> 4]; bufp += spread;
  150.         *bufp = map[b & 0xf]; bufp += spread;
  151.        }
  152.     *pdata_x = data_x & 1;
  153.     return bptr;
  154. }
  155.  
  156. const byte *
  157. sample_unpack_8(byte *bptr, int *pdata_x, const byte *data, int data_x,
  158.   uint dsize, const sample_lookup_t *ptab, int spread)
  159. {    byte *bufp = bptr;
  160.     const byte *psrc = data + data_x;
  161.  
  162.     *pdata_x = 0;
  163.     if ( spread == 1 )
  164.       { if ( ptab->lookup8[0] != 0 ||
  165.          ptab->lookup8[255] != 255
  166.            )
  167.           { uint left = dsize - data_x;
  168.             const byte *map = &ptab->lookup8[0];
  169.  
  170.         while ( left-- )
  171.           *bufp++ = map[*psrc++];
  172.           }
  173.         else
  174.           { /* No copying needed, and we'll use the data right away. */
  175.         return psrc;
  176.           }
  177.       }
  178.     else
  179.       { int left = dsize - data_x;
  180.         const byte *map = &ptab->lookup8[0];
  181.  
  182.         for ( ; left--; psrc++, bufp += spread )
  183.           *bufp = map[*psrc];
  184.       }
  185.     return bptr;
  186. }
  187.